"""
工具函数模块
提供各种辅助功能
"""

import streamlit as st
import base64
import io
from PIL import Image
from typing import Optional, Any, Dict


def image_to_base64(image: Image.Image) -> Optional[str]:
    """
    将 PIL 图像转换为 base64 编码

    Args:
        image: PIL 图像对象

    Returns:
        str: base64 编码的图像数据
    """
    if image is None:
        return None
    buffer = io.BytesIO()
    image.save(buffer, format="JPEG")
    return base64.b64encode(buffer.getvalue()).decode("utf-8")


def file_to_base64(file) -> Optional[str]:
    """
    将上传的文件转换为 base64 编码

    Args:
        file: 上传的文件对象

    Returns:
        str: base64 编码的文件数据
    """
    if file is None:
        return None
    return base64.b64encode(file.getvalue()).decode("utf-8")


def display_json_result(
    result: Dict[str, Any], success_msg: str = "操作成功"
) -> Optional[Dict[str, Any]]:
    """
    显示 JSON 结果

    Args:
        result: API 返回的结果
        success_msg: 成功时显示的消息

    Returns:
        Dict: 成功时返回 data 部分，失败时返回 None
    """
    if result["code"] == 200:
        st.success(success_msg)
        with st.expander("查看详细结果"):
            st.json(result)
        return result.get("data")
    else:
        st.error(f"错误: {result.get('message', '未知错误')}")
        return None


def apply_custom_css():
    """应用自定义 CSS 样式"""
    st.markdown(
        """
        <style>
        .main-header {
            font-size: 24px;
            font-weight: bold;
            margin-bottom: 20px;
            color: #1E88E5;
        }
        
        .sub-header {
            font-size: 20px;
            font-weight: bold;
            margin-bottom: 10px;
            color: #1E88E5;
        }
        
        .info-text {
            font-size: 14px;
            color: #666;
        }
        
        .card {
            padding: 20px;
            border-radius: 5px;
            background-color: #f8f9fa;
            border: 1px solid #eee;
            margin-bottom: 20px;
        }
        </style>
        """,
        unsafe_allow_html=True,
    )
